/* 2º Trabalho de Linguagens de Programação
  Criado por: Rafael Couvinha nº 5631
  Contacto: Rafael_couvinha@live.com.pt */

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <Python.h>

/* Este método permitir-nos-à escrever o resultado da query
   efectuada na função list_estab_per_year no ficheiro Lista_estab_por_ano.txt,
   Recebe um valor lista do tipo PyObject, que será o valor a ser colocado no ficheiro .txt.
   Recebe um valor ano do tipo char, que será o valor a ser colacado no ficheiro .txt.*/
int writefile(PyObject* lista, char ano[5]){

	FILE *f1;
	int i;

	f1 = fopen("Lista_estab_por_ano.txt", "w");
	fprintf(f1, "Ano: %s \n", ano);

	for(i = 0; i < PyList_Size(lista); i++){
		fprintf(f1, "Estabelecimento: %s\n ", PyString_AsString(PyList_GetItem(lista, i)));
	}
	
	fclose(f1);

	return ;

}

/* Este método permitir-nos-à tratar os dados resultantes da query
   efectuada na função count_per_year, este método irá passar o valor da query 
   no argv[0] para uma PyString e fazer o append na lista que lhe é passada por parametro.
   Recebe uma variavel lsita do tipo PyObject*, que é onde os resultados da query
   vão ser guardados.
   Recebe uma variavel argc do tipo inteiro, que é o tamanho do array argv
   Recbe uma variavel argv do tipo char**, que é onde será guardado os dados 
   resultantes da query realziada
   Recebe uma variavel azColName do tipo char**, que é o nome das colunas existentes
   na tabela*/
static int callback1(PyObject* lista, int argc, char **argv, char **azColName){

	PyList_Append(lista, PyString_FromString(argv[0]));
	return 0;
	
}

/* Este método permitir-nos-à estabelecer a ligação à base de dados rebides
   para que possamos efectuar a query da listagem dos estabelecimentos por ano 
   esta ligação e a query é nos possivel utilizando a variavel *db do tipo sqlite3
   Recebe uma variavel ano do tipo int, que é utlizada para realizar a query pretendida.
   Devolve um PyObject* para que este seja reconhecido pelo compilador de Python*/
PyObject* list_estab_per_year(int ano){
	PyObject* lista = PyList_New(0);
	char* name_db= "rebides.db";
	sqlite3 *db;  
	char *zErrMsg = 0;
	int rc;
	char* query;
	char* sAno;

	query = (char *) malloc(sizeof (char[100]));
	sAno = (char *) malloc(sizeof (char));

	strcpy(query, "SELECT DISTINCT estabelecimento FROM fichas_docencia where ano=");
	sprintf(sAno, "%d", ano);
	strcat(query, sAno);

	printf("Ano : %s \n", sAno);
	printf("Query : %s \n", query);
	
	rc = sqlite3_open(name_db, &db);

	rc = sqlite3_exec(db, query, callback1, lista, &zErrMsg);
	if( rc!=SQLITE_OK ){
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);
	}
	sqlite3_close(db);

	writefile(lista, sAno);
	
	free(sAno);
	free(query);

	
	return  lista;
}